package uade.distribuidas.server.dao;


import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;

import uade.distribuidas.repo.exception.ExceptionRodamiento;
import uade.distribuidas.repo.type.EstadoType;
import uade.distribuidas.server.domain.Rodamiento;
import uade.distribuidas.server.hibernate.HibernateUtil;

public class RodamientosDAO {

	private static RodamientosDAO instancia = null;
	private static SessionFactory sf = null;

	public static RodamientosDAO getInstancia(){
		if(instancia == null){
			sf = HibernateUtil.getSessionFactory();
			instancia = new RodamientosDAO();
		} 
		return instancia;
	}
	
	@SuppressWarnings("unchecked")
	public List<Rodamiento> getRodamientos()throws ExceptionRodamiento{
		Session session = sf.openSession();
		
		List<Rodamiento> lista = session.createQuery("from Rodamiento where estado =:estado").setParameter("estado", EstadoType.ACTIVO).list();		
	
		
		session.close();
		return lista;
	}
	
	
	public Rodamiento getRodamiento(Integer id)throws ExceptionRodamiento{
		Session session = sf.openSession();
		
		Rodamiento c = (Rodamiento) session.createQuery("from Rodamiento where id = :id")
				.setParameter("id", id)
				.uniqueResult();			
		
		session.close();
		return c;
	}

	public Rodamiento save(Rodamiento r)throws ExceptionRodamiento {
		Session session = sf.openSession();
		 Transaction transaction = session.beginTransaction();
		 transaction.begin();
		 session.saveOrUpdate(r);
		 transaction.commit();
		 session.close();
		 return r;
	}

	public Rodamiento getRodamiento(String serie, String sufijo, String marca, String origen)throws ExceptionRodamiento {
		Session session = sf.openSession();
		
		Rodamiento r = (Rodamiento) session.createQuery("from Rodamiento where numeroserie = :serie and sufijo = :sufijo and marca = :marca and origen = :origen")
				.setParameter("serie", serie)
				.setParameter("sufijo", sufijo)
				.setParameter("marca", marca)
				.setParameter("origen", origen)
				.uniqueResult();			
		
		session.close();
		return r;
	}
	
	public Rodamiento getRodamiento(String serie)throws ExceptionRodamiento {
		Session session = sf.openSession();
		
		Rodamiento r = (Rodamiento) session.createQuery("from Rodamiento where numeroserie = :serie")
				.setParameter("serie", serie)
				.uniqueResult();			
		
		session.close();
		return r;
	}

	public Rodamiento getRodamientoPorCantidad(String numeroSerie,	Integer cantidadPedida)throws ExceptionRodamiento {
Session session = sf.openSession();
		
		Rodamiento r = (Rodamiento) session.createQuery("from Rodamiento where numeroserie = :serie and stock >= :cantidadPedida")
				.setParameter("serie", numeroSerie)
				.setParameter("cantidadPedida", cantidadPedida)
				.uniqueResult();			
		
		session.close();
		return r;
	}
	
//	public Rodamiento getRodamientoMejorOpcion(String serie, String sufijo, String marca, String origen)throws ExceptionRodamiento {
//		Session session = sf.openSession();
//		
//		Rodamiento r = (Rodamiento) session.createQuery("from Rodamiento where numeroserie = :serie and sufijo = :sufijo and marca = :marca and origen = :origen")
//				.setParameter("serie", serie)
//				.setParameter("sufijo", sufijo)
//				.setParameter("marca", marca)
//				.setParameter("origen", origen)
//				.uniqueResult();	
//		
//		session.close();
//		return r;
//	}
	
}
